package com.liangdemo.web.thread;

import java.util.concurrent.TimeUnit;

public class Test1 {
    public static void main(String[] args) {
//        Date date1 = new Date();
//        Date date2 = new Date();
//        //使用lambda表达式创建线程
//        //线程A
//        new Thread(() -> {
//            date1.func1();
//        }, "A").start();
//
//        //休眠1秒钟在启动线程B
//        try {
//            TimeUnit.SECONDS.sleep(1);
//
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        }
//
//        //线程B
//        new Thread(() -> {
//            date2.func2();
//        }, "B").start();


        Date2 date = new Date2();
        //循环开启五个线程
        for (int i = 1; i < 5; i++) {
            new Thread(() -> {
                date.func();
            }).start();
        }
        date.func();
    }
}

/**
 * 锁方法，
 * 静态方法和非静态方法有不同的区别
 */
class Date {
    public synchronized static void func1() {
        try {
            TimeUnit.SECONDS.sleep(3);//线程睡眠三秒钟

        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("1..");
    }

    public synchronized static void func2() {
        System.out.println("2..");
    }

}

/**
 * 锁代码块
 * 需要传递一个公共资源
 * 使用 this：当前对象
 * 使用 Date2.class ：当前类
 */
class Date2 {
    public void func() {
        synchronized (Date2.class) {
            System.out.println("1..");
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("2..");
        }
    }
}